#include <iostream>
#include <fstream>
#include <cstring>
#include <fcntl.h> // 用于open函数
#include <unistd.h> // 用于close函数
using namespace std;

class file
{
public:
    file(const char *filename)        // 构造函数
    {
        
        // 初始化文件名
        strcpy(this->filename, filename);
        // 读写打开文件
        fd = open(this->filename, O_RDWR | O_CREAT, 0777);
        if(fd == -1)
        {
            perror("open");
            return;
        }else{
            cout << "打开 " << this->filename << " 成功" << endl;
        }
        
    }
    ~file()                           // 析构函数
    {
        // 关闭文件
        close(fd);
        cout << "关闭 " << this->filename << " 成功" << endl;
    }

    void read()    // 读文件
    {
        
        // 读取文件内容
        int ret = ::read(fd, buf, sizeof(buf));
        if(ret == -1)
        {
            perror("read");
            return;
        }
        // 打印读取到的内容
        cout << "读了 " << ret << " 字节: " << endl << buf << endl;
    }
    void readline()          // 读一行
    {
        // 读取文件内容
        int ret = ::read(fd, buf, sizeof(buf));
        if(ret == -1)
        {
            perror("read");
            return;
        }
        // 打印读取到的内容
        cout << "读了 " << ret << " 字节: " << endl << buf << endl;
    }
    void write(char *buf)   // 写文件
    {
        strcpy(this->buf, buf);
        // 写入文件内容
        int ret = ::write(fd, this->buf, strlen(this->buf));
        if(ret == -1)
        {
            perror("write");
            return;
        }
        // 打印写入的内容
        cout << "写了 " << ret << " 字节: " << endl << this->buf << endl;
    }
    void writeall(char buf);           // 写入所有内容
    void lseek(int offset, int whence) // 定位文件指针
    {
        // 将光标放在开头
        // 文件描述符、偏移量、位置
        // SEEK_SET：文件开头
        // SEEK_CUR：当前位置
        // SEEK_END：文件结尾
        int ret = ::lseek(fd, offset, whence);
        if(ret == -1)
        {
            perror("lseek");
            return;
        }
        cout << "光标设置成功" << endl;
    }
    int file_size();                   // 获取文件大小
    bool find_str(const char *str);    // 查找字符串
    int find_num();                    // 返回文件中数字字符个数
    void toBig();                      // 把文件中小写字符变大写
    void copy(const char *new_file);   //  把文件内容拷贝到新文件中
private:
    // 标准或者系统
    int fd; // 文件描述符
    char filename[20]; // 文件名
    char buf[1024] = {0}; // 缓冲区
}; 


int main()
{
    char buf[1024]={0};
    file f1("zuoyetest.txt");
    f1.write("hello world\n");  
    f1.lseek(0, SEEK_SET);
    f1.read();
    
    return 0;
}